common.skill

ভেরিয়েবল এবং ডেটাটাইপস

Computer Programming - সি++ প্রোগ্রামিং (C++ Programming)
332
332

সি++ এ ভেরিয়েবল এবং ডেটাটাইপস গুরুত্বপূর্ণ মৌলিক ধারণা, যা প্রোগ্রামিংয়ের ভিত্তি গঠন করে। নিচে সেগুলোর বিস্তারিত আলোচনা করা হলো:

১. ভেরিয়েবল

ভেরিয়েবল হলো একটি নামকৃত স্থান, যেখানে তথ্য (ডেটা) সংরক্ষিত হয়। প্রোগ্রাম চলাকালীন সময়ে ভেরিয়েবলের মান পরিবর্তন হতে পারে। সি++ এ ভেরিয়েবল ব্যবহার করার জন্য প্রথমে এর ডেটাটাইপ উল্লেখ করে ভেরিয়েবলটি ঘোষণা করতে হয়।

ভেরিয়েবল ঘোষণা ও ইনিশিয়ালাইজেশন

int age;          // ভেরিয়েবল ঘোষণা
age = 25;        // ভেরিয়েবলে মান নির্ধারণ

একত্রিতভাবে ঘোষণা ও ইনিশিয়ালাইজেশন:

int age = 25;    // একসাথে ঘোষণা এবং মান নির্ধারণ

২. ডেটাটাইপস

সি++ এ বিভিন্ন ধরনের ডেটাটাইপস রয়েছে, যা ভেরিয়েবলের মানের প্রকার বোঝাতে ব্যবহৃত হয়। প্রধান ডেটাটাইপগুলো হলো:

১. মৌলিক ডেটাটাইপস

  • int: পূর্ণসংখ্যা ডেটা টাইপ (যেমন: 0, -5, 42)
int number = 10;
  • float: দশমিক সংখ্যা, একক প্রিসিশনে, যা সাধারণত 7 ডিজিট পর্যন্ত সঠিক।
float price = 19.99;
  • double: দ্বিগুণ প্রিসিশনের দশমিক সংখ্যা, যা সাধারণত 15 ডিজিট পর্যন্ত সঠিক।
double pi = 3.14159;
  • char: একটি একক অক্ষর, এর জন্য একক কোটেশন ব্যবহার করা হয়।
char grade = 'A';
  • bool: বুলিয়ান টাইপ, যা সত্য (true) বা মিথ্যা (false) মান ধারণ করতে পারে।
bool isActive = true;

২. কাস্টম ডেটাটাইপস

  • string: সি++ এ স্ট্যান্ডার্ড লাইব্রেরি ব্যবহার করে স্ট্রিং তৈরি করা যায়। এটি একটি অক্ষরের সমষ্টি।
#include <string>

std::string name = "Alice";

৩. অ্যারে

একাধিক মান সংরক্ষণের জন্য ব্যবহার করা হয়। অ্যারেটি একটি নির্দিষ্ট ডেটাটাইপের মাল্টিপল ভ্যালু ধারণ করতে সক্ষম।

int numbers[5] = {1, 2, 3, 4, 5}; // একটি পূর্ণসংখ্যার অ্যারে

৪. স্ট্রাকচার

স্ট্রাকচার ব্যবহার করে বিভিন্ন ডেটাটাইপের মানকে একটি একক ইউনিটে সংরক্ষণ করা যায়।

struct Person {
    std::string name;
    int age;
};

Person person1;
person1.name = "John";
person1.age = 30;

৫. ক্লাস

এটি অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং এর একটি মৌলিক ধারণা, যা ডেটা ও ফাংশনকে একত্রিত করে।

class Car {
public:
    std::string model;
    int year;

    void display() {
        std::cout << model << " - " << year << std::endl;
    }
};

৩. ভেরিয়েবল নামকরণের নিয়ম

ভেরিয়েবল নামকরণের জন্য কিছু সাধারণ নিয়ম পালন করতে হয়:

  • ভেরিয়েবলের নাম অবশ্যই অক্ষর, সংখ্যা বা আন্ডারস্কোর দিয়ে শুরু হতে হবে।
  • কোনো স্পেস বা বিশেষ চিহ্ন (যেমন @, #, $, %) ব্যবহার করা যাবে না।
  • ভেরিয়েবলের নাম সিএসসি সংবিধান অনুসরণ করা উচিত (যেমন, camelCase, snake_case)।

উপসংহার

সি++ এ ভেরিয়েবল এবং ডেটাটাইপগুলি প্রোগ্রামিংয়ের ভিত্তি গঠন করে। এগুলি ব্যবহারে দক্ষতা অর্জন করা অত্যন্ত গুরুত্বপূর্ণ, কারণ এগুলির মাধ্যমে আপনি ডেটাকে ম্যানিপুলেট এবং পরিচালনা করতে পারবেন। সঠিক ডেটাটাইপ ও ভেরিয়েবল ব্যবহার করে আরও কার্যকরী এবং রিসোর্স-বান্ধব প্রোগ্রাম তৈরি করা সম্ভব।

common.content_added_by

ভেরিয়েবল কী এবং এর ব্যবহার

1.7k
1.7k

ভ্যারিয়েবল কী?

ভ্যারিয়েবল হলো একটি নামকৃত স্থান যা কম্পিউটারের মেমোরিতে ডেটা সংরক্ষণ করার জন্য ব্যবহৃত হয়। এটি মূলত একটি শনাক্তকরণ (identifier) যা একটি নির্দিষ্ট ডেটা টাইপের মান ধারণ করে। ভ্যারিয়েবলগুলি প্রোগ্রামিংয়ের মৌলিক উপাদান এবং প্রোগ্রাম চলাকালীন ডেটা পরিচালনা করার জন্য প্রয়োজনীয়।


ভ্যারিয়েবলের মৌলিক গঠন

১. নামকরণ:

  • ভ্যারিয়েবলের নাম অবশ্যই অক্ষর দিয়ে শুরু হতে হবে এবং এতে অক্ষর, সংখ্যা, এবং আন্ডারস্কোর (_) থাকতে পারে।
  • বিশেষ চিহ্ন (যেমন: !, @, #, $, %) ব্যবহার করা যাবে না।

২. ডেটা টাইপ:

  • ভ্যারিয়েবল তৈরি করার সময় এটি একটি নির্দিষ্ট ডেটা টাইপ নির্ধারণ করতে হবে, যা নির্দেশ করে ভ্যারিয়েবলটির ধারণক্ষমতা এবং বৈশিষ্ট্য।

সি++ এ ভ্যারিয়েবলের প্রকারভেদ

সি++ এ বিভিন্ন ধরনের ভ্যারিয়েবল এবং ডেটা টাইপ রয়েছে:

প্রাথমিক ডেটা টাইপ:

  • int: পূর্ণসংখ্যা (যেমন: 5, -10)
  • float: দশমিক সংখ্যা (যেমন: 3.14)
  • double: দ্বিগুণ সঠিকতা সম্পন্ন দশমিক সংখ্যা
  • char: একটি অক্ষর (যেমন: 'A')
  • bool: সত্য বা মিথ্যা (true/false) মান ধারণ করে

কম্পোজিট ডেটা টাইপ:

  • string: অক্ষরের একটি সেট (যেমন: "Hello, World!")
  • array: একই ধরনের ভ্যালুগুলোর একটি সংগ্রহ (যেমন: int numbers[5] = {1, 2, 3, 4, 5};)
  • structure: বিভিন্ন ডেটা টাইপ একত্রে ধারণ করে।

ডাইনামিক ভ্যারিয়েবল:

  • ডাইনামিক মেমোরি এলোকেশনের মাধ্যমে ভ্যারিয়েবল তৈরি করা হয়, যেমন new এবং delete ব্যবহার করে।

ভ্যারিয়েবলের ব্যবহার

ভ্যারিয়েবলগুলি প্রোগ্রামিংয়ে বিভিন্নভাবে ব্যবহৃত হয়:

ডেটা সংরক্ষণ:

  • ভ্যারিয়েবলগুলি তথ্য সংরক্ষণ করার জন্য ব্যবহৃত হয়, যা পরে প্রোগ্রামে বিভিন্ন স্থানে ব্যবহার করা যায়।
int age = 25; // বয়সের জন্য একটি ভ্যারিয়েবল

গণনা:

  • ভ্যারিয়েবলগুলি গাণিতিক অপারেশন করার জন্য ব্যবহার করা হয়।
int a = 10, b = 20;
int sum = a + b; // মোটের জন্য ভ্যারিয়েবল

শর্ত যাচাই:

  • শর্তমূলক বিবৃতি ব্যবহারের সময় ভ্যারিয়েবল ব্যবহার করা হয়।
if (age >= 18) {
   cout << "You are an adult.";
}

ফাংশন প্যারামিটার:

  • ফাংশনের মধ্যে ডেটা প্রেরণ করার জন্য ভ্যারিয়েবল ব্যবহার করা হয়।
void displayAge(int age) {
   cout << "Your age is: " << age;
}

ইনপুট ও আউটপুট:

  • ইউজার থেকে ইনপুট নেওয়ার জন্য ভ্যারিয়েবল ব্যবহার করা হয় এবং আউটপুট প্রদর্শনের জন্যও ব্যবহার করা হয়।
int number;
cout << "Enter a number: ";
cin >> number; // ইনপুট গ্রহণ

ভ্যারিয়েবলের উদাহরণ

এখানে একটি উদাহরণ দেখানো হলো যা ভ্যারিয়েবল ব্যবহারের বিভিন্ন দিক তুলে ধরে:

#include <iostream>
using namespace std;

int main() {
    // ভ্যারিয়েবল ঘোষণা ও ইনিশিয়ালাইজেশন
    int age;
    float salary;
    char grade;
    string name;

    // ইনপুট নেওয়া
    cout << "Enter your name: ";
    cin >> name;
    cout << "Enter your age: ";
    cin >> age;
    cout << "Enter your salary: ";
    cin >> salary;
    cout << "Enter your grade: ";
    cin >> grade;

    // আউটপুট প্রদর্শন
    cout << "Name: " << name << endl;
    cout << "Age: " << age << endl;
    cout << "Salary: " << salary << endl;
    cout << "Grade: " << grade << endl;

    return 0; // প্রোগ্রাম সফলভাবে শেষ হয়েছে
}

সারসংক্ষেপ

ভ্যারিয়েবল হলো প্রোগ্রামিংয়ের একটি মৌলিক উপাদান যা ডেটা সংরক্ষণ, প্রক্রিয়া এবং পরিচালনা করতে ব্যবহৃত হয়। সঠিকভাবে ভ্যারিয়েবল ব্যবহার করা হলে প্রোগ্রাম লেখার সময় আরও কার্যকরী এবং সহজবোধ্য হয়। সি++ এ ভ্যারিয়েবলের ধারণা এবং তাদের কার্যকর ব্যবহার শেখার মাধ্যমে একজন নতুন প্রোগ্রামার আরও দক্ষ এবং সৃজনশীল হতে পারে।

common.content_added_and_updated_by

প্রিমিটিভ ডেটাটাইপস: int, float, char, double, ইত্যাদি

284
284

সি++-এ প্রিমিটিভ ডেটাটাইপগুলি হলো মৌলিক ডেটাটাইপ যা ভাষাটির দ্বারা সরাসরি সমর্থিত হয়। এগুলি সাধারণত একটি ভ্যারিয়েবলে একক মান ধারণ করে। নিচে সি++-এর প্রিমিটিভ ডেটাটাইপগুলি এবং তাদের বৈশিষ্ট্যগুলো বিস্তারিতভাবে উল্লেখ করা হলো:

১. int

  • বর্ণনা: পূর্ণসংখ্যা ডেটাটাইপ, যা নেগেটিভ এবং পজিটিভ উভয় সংখ্যা ধারণ করতে পারে।
  • আকার: সাধারণত 4 বাইট (32-বিট), যা -2,147,483,648 থেকে 2,147,483,647 পর্যন্ত সংখ্যা ধারণ করতে পারে।
উদাহরণ:
int age = 25; // একটি পূর্ণসংখ্যা ভ্যারিয়েবল

২. float

  • বর্ণনা: একক প্রিসিশনের দশমিক সংখ্যা, যা সাধারণত 7 ডিজিট পর্যন্ত সঠিকতা প্রদান করে।
  • আকার: সাধারণত 4 বাইট (32-বিট)।
  • উদাহরণ:
float temperature = 36.5f; // একটি ফ্লোট ভ্যারিয়েবল

৩. double

  • বর্ণনা: দ্বিগুণ প্রিসিশনের দশমিক সংখ্যা, যা সাধারণত 15 ডিজিট পর্যন্ত সঠিকতা প্রদান করে।
  • আকার: সাধারণত 8 বাইট (64-বিট)।
  • উদাহরণ:
double pi = 3.141592653589793; // একটি ডাবল ভ্যারিয়েবল

৪. char

  • বর্ণনা: একটি একক অক্ষর ধারণ করতে ব্যবহৃত হয়, যা সাধারণত ASCII বা Unicode মান ধারণ করে।
  • আকার: সাধারণত 1 বাইট (8-বিট)।
  • উদাহরণ:
char grade = 'A'; // একটি ক্যারেক্টার ভ্যারিয়েবল

৫. bool

  • বর্ণনা: একটি বুলিয়ান ডেটাটাইপ, যা সত্য (true) অথবা মিথ্যা (false) মান ধারণ করে।
  • আকার: সাধারণত 1 বাইট (8-বিট), যদিও ভ্যালু 1 (true) অথবা 0 (false) হিসেবে স্টোর হয়।
  • উদাহরণ:
bool isAdult = true; // একটি বুলিয়ান ভ্যারিয়েবল

৬. void

  • বর্ণনা: এটি একটি বিশেষ ডেটাটাইপ যা কোন মান ধারণ করে না। এটি সাধারণত ফাংশনের রিটার্ন টাইপ নির্দেশ করতে ব্যবহৃত হয় যেখানে কোন মান ফেরত দেওয়া হয় না।
  • উদাহরণ:
void displayMessage() {
    std::cout << "Hello, World!" << std::endl;
}

৭. ব্যবহার

প্রিমিটিভ ডেটাটাইপগুলি সি++ প্রোগ্রামিংয়ের মূল ভিত্তি গঠন করে এবং তাদের মাধ্যমে আপনি ভ্যারিয়েবলগুলিতে বিভিন্ন ধরনের তথ্য সংরক্ষণ এবং প্রক্রিয়া করতে পারেন। উপরে উল্লেখিত ডেটাটাইপগুলির সঠিক ব্যবহার নিশ্চিত করে প্রোগ্রামের কার্যকারিতা এবং স্থায়িত্ব।

উপসংহার

সি++-এর প্রিমিটিভ ডেটাটাইপগুলি ভাষাটির মৌলিক কাঠামো তৈরি করে এবং আপনি যখনই একটি নতুন ভ্যারিয়েবল ঘোষণা করেন, তখন সঠিক ডেটাটাইপ নির্বাচন করা অত্যন্ত গুরুত্বপূর্ণ। সঠিকভাবে ডেটাটাইপের ব্যবহার করে আপনার প্রোগ্রামের কার্যকারিতা, স্পষ্টতা এবং কার্যকারিতা বৃদ্ধি পাবে।

common.content_added_and_updated_by

কনস্ট্যান্ট এবং const কীওয়ার্ড

352
352

কনস্ট্যান্ট (Constant) কি?

কনস্ট্যান্ট হলো একটি ভ্যারিয়েবল যার মান প্রোগ্রামের চলাকালীন পরিবর্তন করা যায় না। অর্থাৎ, একবার মান সেট করার পর, এটি পুনরায় পরিবর্তনযোগ্য নয়। কনস্ট্যান্ট ব্যবহারের মাধ্যমে প্রোগ্রামার নিশ্চিত করে যে একটি নির্দিষ্ট মান নিরাপদে এবং নির্ভরযোগ্যভাবে ব্যবহার করা হচ্ছে, যা প্রোগ্রামের নিরাপত্তা এবং স্থিতিশীলতা বাড়ায়।

C++ এ কনস্ট্যান্ট এবং const কীওয়ার্ড

সি++ প্রোগ্রামিং ভাষায় কনস্ট্যান্ট তৈরি করতে const কীওয়ার্ড ব্যবহার করা হয়। যখন একটি ভ্যারিয়েবলে const কীওয়ার্ড যুক্ত করা হয়, তখন সেই ভ্যারিয়েবলের মান স্থির হয় এবং এটি পুনরায় পরিবর্তন করা যায় না।

কনস্ট্যান্ট ব্যবহার করার উদাহরণ

#include <iostream>
using namespace std;

int main() {
    const int MAX_VALUE = 100; // কনস্ট্যান্ট ঘোষণা
    cout << "Max Value: " << MAX_VALUE << endl;

    // MAX_VALUE = 200; // এই লাইনটি ত্রুটি উৎপন্ন করবে, কারণ কনস্ট্যান্ট পরিবর্তনযোগ্য নয়

    return 0; // প্রোগ্রাম সফলভাবে শেষ হয়েছে
}

কনস্ট্যান্ট এবং const এর বৈশিষ্ট্য

মূল্য স্থিরকরণ:

  • কনস্ট্যান্টের মান একবার সেট করার পর পরিবর্তন করা যায় না। এটি কনস্ট্যান্ট ভ্যারিয়েবলের নিরাপত্তা বৃদ্ধি করে।

সঠিকভাবে ব্যবহার:

  • কনস্ট্যান্ট ব্যবহার করলে প্রোগ্রামে ভুলভাবে মান পরিবর্তনের সম্ভাবনা কমে যায়।

ফাংশন প্যারামিটার:

  • ফাংশন প্যারামিটারে const ব্যবহার করলে এটি নিশ্চিত করে যে ফাংশনের ভিতরে সেই প্যারামিটার পরিবর্তন করা হবে না।

পয়েন্টার:

  • পয়েন্টার ব্যবহার করার সময় const কীওয়ার্ড দিয়ে একটি কনস্ট্যান্ট পয়েন্টার তৈরি করা যায়, যা নির্দেশ করে যে পয়েন্টারটির মাধ্যমে কোন মান পরিবর্তন করা যাবে না।

কনস্ট্যান্টের বিভিন্ন ব্যবহার

সংখ্যার কনস্ট্যান্ট:

const double PI = 3.14159; // পাই কনস্ট্যান্ট

ফাংশনের কনস্ট্যান্ট প্যারামিটার:

void calculateArea(const double radius) {
    double area = PI * radius * radius; // radius পরিবর্তন করা যাবে না
    cout << "Area: " << area << endl;
}

কনস্ট্যান্ট পয়েন্টার:

int value = 10;
const int* ptr = &value; // পয়েন্টারের মাধ্যমে value পরিবর্তন করা যাবে না

কনস্ট্যান্ট ক্লাস মেম্বার:

  • ক্লাসে কনস্ট্যান্ট মেম্বার ব্যবহার করা যেতে পারে যাতে একটি নির্দিষ্ট অবজেক্টের প্রপার্টি পরিবর্তন না হয়।

সারসংক্ষেপ

সি++ এ const কীওয়ার্ড এবং কনস্ট্যান্ট ভ্যারিয়েবলগুলি প্রোগ্রামে নিরাপত্তা ও স্থিতিশীলতা বাড়াতে ব্যবহৃত হয়। একবার মান সেট করার পর কনস্ট্যান্টের মান পরিবর্তন করা যায় না, যা কোডের সঠিকতা নিশ্চিত করে। সঠিকভাবে কনস্ট্যান্ট ব্যবহার করার মাধ্যমে প্রোগ্রামাররা তাদের কোডকে আরও পরিষ্কার এবং নিরাপদ করতে পারেন।

common.content_added_and_updated_by

টাইপ কাস্টিং

280
280

সি++-এ টাইপ কাস্টিং হল একটি প্রক্রিয়া যার মাধ্যমে একটি ডেটাটাইপকে অন্য ডেটাটাইপে রূপান্তর করা হয়। টাইপ কাস্টিং দুই প্রকারের হতে পারে: অImplicit Cast (অটোমেটিক কাস্টিং) এবং Explicit Cast (স্পষ্ট কাস্টিং)। টাইপ কাস্টিংয়ের মাধ্যমে প্রোগ্রামে ডেটা ম্যানিপুলেশন ও সমন্বয় করা সহজ হয়।

১. অImplicit Cast (অটোমেটিক কাস্টিং)

অImplicit Cast তখন ঘটে যখন সি++ কম্পাইলার স্বয়ংক্রিয়ভাবে একটি ডেটাটাইপকে অন্য ডেটাটাইপে রূপান্তর করে। সাধারণত, যখন একটি ছোট ডেটাটাইপ বড় ডেটাটাইপের সাথে গাণিতিক অপারেশন করা হয় তখন এটি ঘটে।

উদাহরণ:

int a = 10;
float b = a; // int থেকে float এ অটোমেটিক কাস্টিং
std::cout << b; // আউটপুট হবে: 10.0

এখানে int টাইপের a কে float টাইপের b তে রূপান্তর করা হয়েছে। এটি স্বয়ংক্রিয়ভাবে হয়েছে।

২. Explicit Cast (স্পষ্ট কাস্টিং)

Explicit Cast হল সেই কাস্টিং যেখানে প্রোগ্রামার নিজেই একটি টাইপকে অন্য টাইপে রূপান্তর করতে নির্দেশনা দেয়। এটি সি++ এ কয়েকটি উপায়ে করা যায়:

a. C-স্টাইল কাস্টিং

double pi = 3.14;
int intPi = (int)pi; // double থেকে int এ কাস্টিং
std::cout << intPi; // আউটপুট হবে: 3

b. static_cast

static_cast হল C++ এর একটি নির্দিষ্ট কাস্টিং অপারেটর যা কম্পাইল টাইমে নিরাপত্তা নিশ্চিত করে। এটি সাধারণত নিরাপদ টাইপ কাস্টিংয়ের জন্য ব্যবহৃত হয়।

double pi = 3.14;
int intPi = static_cast<int>(pi); // static_cast ব্যবহার করে কাস্টিং
std::cout << intPi; // আউটপুট হবে: 3

c. dynamic_cast

dynamic_cast প্রধানত পলিমরফিক ক্লাসের জন্য ব্যবহৃত হয়। এটি নিরাপত্তা নিশ্চিত করে এবং যদি কাস্টিং সফল না হয়, তবে এটি nullptr ফেরত দেয়।

class Base {
    virtual void show() {}
};

class Derived : public Base {
    void show() override {}
};

Base* basePtr = new Derived();
Derived* derivedPtr = dynamic_cast<Derived*>(basePtr); // dynamic_cast ব্যবহার
if (derivedPtr) {
    std::cout << "Casting successful!" << std::endl;
}

d. const_cast

const_cast ব্যবহার করে আপনি একটি কনস্ট্যান্ট ভ্যারিয়েবলের কনস্ট্যান্সি মুছতে পারেন।

const int a = 10;
int* b = const_cast<int*>(&a); // const_cast ব্যবহার

e. reinterpret_cast

reinterpret_cast মূলত বিট-ফর-বিট কাস্টিং করার জন্য ব্যবহৃত হয়। এটি এক ধরনের টাইপ কাস্টিং যা সাধারণত নিরাপদ নয় এবং ব্যবহারে সতর্কতা প্রয়োজন।

int a = 10;
void* ptr = reinterpret_cast<void*>(&a); // reinterpret_cast ব্যবহার

টাইপ কাস্টিংয়ের সুবিধা ও অসুবিধা

সুবিধা:

  • নমনীয়তা: বিভিন্ন ডেটাটাইপের সাথে কাজ করার সুযোগ।
  • কোডের পরিষ্কারতা: প্রোগ্রামার স্পষ্টভাবে টাইপ কাস্টিং নির্দেশ করতে পারেন।
  • নিরাপত্তা: বিশেষ কাস্টিং অপারেটর ব্যবহার করে টাইপ নিরাপত্তা নিশ্চিত করা যায়।

অসুবিধা:

  • ডেটা হ্রাস: ভুল কাস্টিংয়ের ফলে ডেটা হারানো বা পরিবর্তন হতে পারে।
  • বিট-ফর-বিট পরিবর্তন: reinterpret_cast ব্যবহারের সময় এটি নিরাপদ নয় এবং সমস্যা সৃষ্টি করতে পারে।

উপসংহার

টাইপ কাস্টিং সি++ প্রোগ্রামিংয়ের একটি গুরুত্বপূর্ণ অংশ, যা আপনাকে বিভিন্ন ডেটাটাইপের মধ্যে রূপান্তর করতে সক্ষম করে। এটি নিরাপদভাবে এবং কার্যকরভাবে কাস্টিং করতে static_cast, dynamic_cast, const_cast, এবং reinterpret_cast ব্যবহার করা গুরুত্বপূর্ণ। টাইপ কাস্টিংয়ের সময় সতর্কতা অবলম্বন করা উচিৎ, কারণ এটি প্রোগ্রামের আচরণকে প্রভাবিত করতে পারে।

common.content_added_and_updated_by
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion